package model;
import java.io.*;
import java.util.*;
/**
* La clase tarjeta contiene los atributos y metodos comunes a sus subclases (social, universitaria, general), ya que en lo unico que se 
* diferencian es en la tarifa. 
* 
* @version r13 15/05/09
* @author Sergio Morlan Reborido
* @author Juan Ramon Nogueira Moreiras
*/
public class Tarjeta
{
	protected String identificador;
	protected int saldoInicial;
	protected String nombre;
	protected String tipoTarjeta;
	protected static int precio;
	protected Collection c = new ArrayList();
	private static ArrayList <Operacion> fechas = new ArrayList<Operacion>();


/**
* Devuelve los datos de las tarjetas que deseamos mostrar por pantalla.
* @return identificador El numero de identificacion de la tarjeta
* @return saldoInicial El saldo del que dispone la tarjeta
* @return nombre El nombre del usuario de la tarjeta
* @return tipoTarjeta El tipo de tarjeta que es (general,universitaria o social)
*/
	public String toString()
	{
		return "*DATOS TARJETA: \nId: "+identificador+"\nNombre: "+nombre+"\nSaldo: "+saldoInicial+"\nTipo: "+ tipoTarjeta;
	}

/**
* Este metodo devuelve, del objeto correspondiente, las operaciones que se han realizado entre dos fechas. Comprueba la collection de la tarjeta y si 
* se encuentra entre las fechas deseadas, las operaciones que contiene,las inserta en un array que devuelve como iterator.
* @param fecha1 La fecha desde la cual se desea buscar
* @param fecha2 La fechas asta la cual se desea buscar
* @return iterad El iterador con las operaciones entre las fechas indicadas 
*/
	public Iterator consultarFechas(Date fecha1,Date fecha2)
	{
		fechas.clear();
		Iterator<Operacion> iterador = c.iterator();
		while(iterador.hasNext())
		{
			Operacion oper = iterador.next();
			if(oper.fecha.after(fecha1) && oper.fecha.before(fecha2))
				fechas.add(oper);
		}	
		Iterator<Operacion> iterad = fechas.iterator();
		return iterad;
	}

/**
* Añade una operacion a la collection del objeto tarjeta
* @param op Es el tipo de operacion que se va a insertar en la collection
*/
	public void añadirOp(Operacion op)
	{
		c.add(op);
	}

/**
* Consulta el importe de una tarjeta, segun sea de una de las subclases (general,universitaria,social).
* @return precio El precio del viaje cuando el usuario de sube al bus
*/ 
	public int consultarImporte()
	{
		return precio;
	}
	
/**
* Resta la cantidad correspondiente sobre la tarjeta que desea. 
* @param importe El importe que va a prestar una persona a otra.
*/
	public void prestar(int importe)
	{
		saldoInicial=saldoInicial-importe;
	}

/**
* Suma el importe al saldo de la tarjeta, ya bien sea por una recarga o por una transferencia de saldo desde otra tarjeta.
* @param importe El importe a sumar al saldo existente en la tarjeta
*/
	public void cargar(int importe)
	{
		saldoInicial=saldoInicial+importe;
	}

/**
* Cuando una persona sube al autobus, se comprueba que tiene suficiente saldo para el pago y se le resta en caso afirmativo, mostrando el saldo 
* restante.
*/
	public void subir()
	{
		saldoInicial=saldoInicial-precio;
		System.out.println(" Saldo restante: "+saldoInicial);
	}

/**
* Devuelve el saldo que contiene una tarjeta.
* @return saldoInicial El saldo que contiene una tarjeta
*/
	public int mirarSaldo()
	{
		return saldoInicial;
	}

}
